package com.witframework.core.persistence;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateTemplate;


/**
 * dao接口的基础父类，定义了常用的接口方法，具体的dao接口可以通过继承该接口
 * 获取缺省的方法定义
 * @author wuxinyang
 *
 * @param <T>
 */
public interface IBaseDao <T>{
	public abstract HibernateTemplate getHibernateTemplate();

	
	public abstract Class getEntityClass();
	/**
	 * 返回给实体类型已持久化的实体对象，根据给定的标识查找，如果未找到则返回null。
	 * 实体类型由getPersistentClass（）指定的。
	 * @param id - 持久化对象实例的标识
	 * @return 持久化对象实例, 如果未找到则返回null。
	 * @throws ObjectRetrievalFailureException -  if not found
	 * @throws DataAccessException - in case of Hibernate errors
	 */
	public abstract T findById(Serializable id) throws DataAccessException;
	/**
	 * 返回给实体类型已持久化的实体对象，根据给定的标识查找，如果未找到则返回null。
	 * @param id -持久化对象实例的标识
	 * @param lock -是否锁定
	 * @return 持久化对象实例, 如果未找到则返回null。
	 * @throws DataAccessException
	 */
	public abstract T findById(Serializable id,boolean lock) throws DataAccessException;
	
	public int getAllSize() throws DataAccessException;
	/**
	 * 返回给实体类型的所有已持久化的实例。
	 * 实体类型由getPersistentClass（）指定的。
	 * @return List 包含0或多个持久化实例对象。
	 * @throws DataAccessException
	 */
	public abstract List<T> getAll() throws DataAccessException;

	/**
	 * 持久化给定的实体对象
	 * @param entity - 要持久化的实体对象
	 * @return 返回已持久化对象实例的标识
	 * @throws DataAccessException -  in case of Hibernate errors
	 */
	public abstract String save(T entity) throws DataAccessException;
	public abstract void saveAll(Collection entityCollection) throws DataAccessException ;
	/**
	 * 更新给定的实体对象的持久化数据
	 * @param entity -  the persistent instance to update
	 * @throws DataAccessException - in case of Hibernate errors
	 */
	public abstract void update(T entity) throws DataAccessException;
	/**
	 * 持久化给定的实体对象
	 * @param entity - 要持久化的实体对象
	 * @return 返回已持久化对象实例的标识
	 * @throws DataAccessException -  in case of Hibernate errors
	 */
	public abstract String saveOrUpdate(T entity) throws DataAccessException;
	public abstract void saveOrUpdateAll(Collection entityCollection) throws DataAccessException;
	/**
	 * 判断对象是否唯一
	 * @param entity
	 * @param uniquePropertyNames
	 * @return -boolean
	 */
	public abstract boolean isUnique(T entity, String uniquePropertyNames);
	/**
	 * 删除实体对象的持久化数据，该实体数据是根据给定的标识查找到的。
	 * @param id - the identifier of the persistent instance
	 * @throws DataAccessException - in case of Hibernate errors
	 */
	public abstract void deleteById(final Serializable id) throws DataAccessException;
	/**
	 * 删除实体对象的持久化数据,该实体数据是根据给定的属性和值查找到的。
	 * @param propertyName -属性名称
	 * @param value -属性的值
	 */
	public abstract void deleteBy(String propertyName,Object value);
	/**
	 * 删除实体对象的持久化数据，该实体数据是根据给定的一个或多个(数组)标识查ID找到的。
	 * @param ids -ID,连续列出的多个ID值或包含ID值的数组
	 * @throws DataAccessException
	 */
	public void deleteAllByIds(String...ids) throws DataAccessException;
	/**
	 * 删除集合中的所有实体的持久化数据
	 * @param entities -包含实体对象的集合
	 */
	public abstract void deleteAll(Collection<T> entities);
	public abstract void deleteAll();
	/**
	 * 删除单个实体对象的数据从持久化数据中
	 * @param o
	 * @throws DataAccessException
	 */
	public abstract void delete(T o) throws DataAccessException;
	/**
	 * 查找实体
	 * @param filter -数据过滤条件，键-值映射关系为实体的属性和值
	 * @return -包含实体对象的List 集合
	 * @see #findBy(String, Object)
	 */
	public abstract List<T> findBy(Map<String ,Object> filter);
	public abstract List<T> findBy(Map<String,Object> filter, String orderBy, boolean isAsc);
	/**
	 * 查找实体
	 * @param propertyName -属性名称
	 * @param value -属性的值
	 * @return -包含实体对象的List 集合
	 * @see #findBy(Map)
	 */
	public abstract List<T> findBy(String propertyName,Object value);
	public abstract T getBy(String propertyName,Object value);
	/**
	 * 分页查询
	 * @param filter 键-值映射关系为实体的属性和值
	 * @param psm -分页模型
	 * @return -包含实体对象的List 集合
	 *
	 */
	public abstract List<T> pagedQuery(Map<String,String> filter,PageSortModel psm);

	public abstract T merge(T o);

	/**
	 * 执行“命名”查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @return 包含实体对象的List 集合
	 */
	public abstract List findByNamedQuery(final String queryName) throws DataAccessException ;

	/**
	 * 执行“命名”查询，绑定一个查询参数值到查询语句中的“？”
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param value ？参数值
	 * @return 包含实体对象的List 集合
	 */
	public abstract List findByNamedQuery(final String queryName,final Object value) throws DataAccessException ;

	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“？”
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param values ？参数值
	 * @return 包含实体对象的List 集合
	 */
	public abstract List findByNamedQuery(final String queryName, final Object[] values) throws DataAccessException ;


	/**
	 * 执行“命名”查询，绑定参数值到“:”形式命名的参数在查询语句中
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramName 参数名称
	 * @param value 参数值
	 * @return 包含实体对象的List 集合
	 */
	public abstract List findByNamedQueryAndNamedParam(final String queryName,String paramName, Object value);

	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“：”命名参数
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramNames 参数名称
	 * @param values “：”命名参数的值
	 * @return 包含实体对象的List 集合
	 */
	public abstract List findByNamedQueryAndNamedParam(final String queryName, final String[] paramNames, final Object[] values)throws DataAccessException;

	/**
	 * 执行“命名”查询，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	public abstract List<T> pagedQueryByNamedQuery(String queryName,PageSortModel psm)throws DataAccessException ;

	/**
	 * 执行“命名”查询，绑定一个查询参数值到查询语句中的“？”，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param value ？参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	public abstract List<T> pagedQueryByNamedQuery(String queryName, Object value,PageSortModel psm) throws DataAccessException;

	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“？”，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param values ？参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	public abstract List<T> pagedQueryByNamedQuery(final String queryName, final Object[] values,PageSortModel psm) throws DataAccessException ;

	/**
	 * 执行“命名”查询，绑定参数值到“:”形式命名的参数在查询语句中，分页查询
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramName 参数名称
	 * @param value 参数值
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	public abstract List<T> pagedQueryByNamedQueryAndNamedParam(String queryName,String paramName, Object value,PageSortModel psm);


	/**
	 * 执行“命名”查询，绑定每个查询参数值到查询语句中的“：”命名参数
	 * 这个“命名”查询在Hibernate映射文件中定义
	 * @param queryName 在Hibernate映射文件中定义的“命名”查询的名字
	 * @param paramNames 参数列表
	 * @param values “：”命名参数的值列表
	 * @param psm -分页模型
	 * @return 包含实体对象的List 集合
	 */
	public abstract List<T> pagedQueryByNamedQueryAndNamedParam(String queryName,String[] paramNames, Object[] values,PageSortModel psm);
	
}